home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
tools
/
ivl
/
src
/
ivl_ctrl.c
< prev
next >
Wrap
Text File
|
2000-06-23
|
6KB
|
245 lines
/*
#define DEBUG
* ivl
*
* ユーザ操作受け付け処理関連
*
* from Jun.26,1999 by dummy.x.(with J-SAGA INDUSTRY)
*/
#include <sys\iocs.h>
#include "comtype.h"
#include "easymac.h"
#include "ivl.h"
/* 定数定義 */
/* マウスボール移動判定量
* 「最低これだけ動かないと認識しない」値
* これらはコンパイルオプションで値を変更することもできる
* ちなみに、横=16/縦=12 というのは IV.X での値
*/
#if !defined(MS_MOVE_MIN_X)
#define MS_MOVE_MIN_X 16 /* 横方向 */
#endif
#if !defined(MS_MOVE_MIN_Y)
#define MS_MOVE_MIN_Y 12 /* 縦方向 */
#endif
/* ジョイスティック入力関連 */
/* bit情報 */
#define JOY_STK_UP (1 << 0) /* スティック上 */
#define JOY_STK_DW (1 << 1) /* スティック下 */
#define JOY_STK_LF (1 << 2) /* スティック左 */
#define JOY_STK_RG (1 << 3) /* スティック右 */
#define JOY_STK_ALL (JOY_STK_UP | JOY_STK_DW | JOY_STK_LF | JOY_STK_RG)
/* スティック各方向 */
#define JOY_BTN_A (1 << 5) /* トリガA */
#define JOY_BTN_B (1 << 6) /* トリガB */
#define JOY_BTN_AB (JOY_BTN_A | JOY_BTN_B) /* 通常トリガ全部 */
#define JOY_BTN_SEL (JOY_STK_UP | JOY_STK_DW) /* TOWNS:SELECT */
#define JOY_BTN_RUN (JOY_STK_LF | JOY_STK_RG) /* TOWNS:RUN */
/* キーボード入力を眺める
* 返値: 操作コード(CTRL_~)
*/
static
int control_by_key(void)
{
int result = CTRL_NONE;
uchar keycode;
/* とりあえず何かキーが押されてるか見る */
if (_iocs_b_keysns() == 0) { /* 押されてなければ */
return result; /* さっさと返る */
}
/* 押されてたキーのキーコードを取得 */
keycode = _iocs_b_keyinp() >> 8;
/* その値で分岐 */
switch (keycode) {
case 0x01: /* [ESC] */
result = CTRL_QUIT;
break;
case 0x11: /* [Q] */
result = CTRL_QUIT_KPSCR;
break;
case 0x55: /* [XF1] */
case 0x38: /* [ROLL UP] */
case 0x1d: /* [Return] */
result = CTRL_NEXTPAGE;
break;
case 0x3e: /* [↓] */
case 0x35: /* [Space] */
result = CTRL_NEXTLINE;
break;
case 0x3c: /* [↑] */
result = CTRL_BACKLINE;
break;
case 0x56: /* [XF2] */
case 0x39: /* [ROLL DOWN] */
case 0x0f: /* [BS] */
result = CTRL_BACKPAGE;
break;
case 0x36: /* [HOME] */
result = CTRL_FIRSTPAGE;
break;
case 0x3b: /* [←] */
result = CTRL_WIDTH_512;
break;
case 0x3d: /* [→] */
result = CTRL_WIDTH_768;
break;
#if 0
case 0x18: /* [I] */
result = CTRL_INFO_CHG;
break;
#endif
case 0x19: /* [O] */
result = CTRL_INFO_NAME;
break;
case 0x1a: /* [P] */
result = CTRL_INFO_PATH;
break;
case 0x1b: /* [@] */
result = CTRL_INFO_INFO;
break;
case 0x30: /* [M] */
result = CTRL_DISP_MONO;
break;
case 0x2f: /* [N] */
result = CTRL_DISP_NGTV;
break;
case 0x2e: /* [B] */
result = CTRL_DISP_NORM;
break;
default:
/* 既に「何もしない」の返値が収まってるので何もしない */
break;
}
return result;
}
/* マウス入力を眺める
* 返値: 操作コード(CTRL_~)
*/
static
int control_by_mouse(void)
{
int result = CTRL_NONE;
static ushort oldsts;
schar xmov, ymov;
ushort eorsts;
long cursts;
/* 現時点でのマウスボタン状況を取得 */
cursts = _iocs_ms_getdt();
eorsts = (ushort)cursts ^ oldsts; /* .b=!0:ボタン状態に変化があった */
/* マウスボタン処理 */
if (eorsts) { /* ボタンの入力状況に変化があった */
ushort tmp = eorsts & oldsts; /* .b=!0:前回押されてて今回離された */
if ((ushort)cursts == 0xffff) { /* L+R */
result = CTRL_QUIT;
} else if ((short)tmp < 0) { /* L */
result = CTRL_NEXTPAGE;
} else if ((char)tmp < 0) { /* R */
result = CTRL_BACKPAGE;
}
} else { /* ボタンが押されてなければ */
/* マウスボール処理 */
xmov = hie_byte_l(cursts); /* bit31-24:X移動量 */
if (xmov < -MS_MOVE_MIN_X) { /* ← */
result = CTRL_WIDTH_512;
} else if (xmov > +MS_MOVE_MIN_X) { /* → */
result = CTRL_WIDTH_768;
} else {
ymov = hi_byte_l(cursts); /* bit23-16:Y移動量 */
if (ymov < -MS_MOVE_MIN_Y) { /* ↑ */
result = CTRL_BACKLINE;
} else if (ymov > +MS_MOVE_MIN_Y) { /* ↓ */
result = CTRL_NEXTLINE;
}
}
}
/* 今回のボタン状況を次回の「前状況」として保持 */
oldsts = (ushort)cursts;
return result;
}
/* ジョイスティック入力を眺める
* 返値: 操作コード(CTRL_~)
*/
static
int control_by_joystick(void)
{
int result = CTRL_NONE;
static uchar oldstk;
uchar curstk, eorstk, curtrg;
/* 現時点でのマウスボタン状況を取得 */
curstk = ~_iocs_joyget(0); /* bit=1:入力されている */
eorstk = curstk ^ oldstk; /* bit=1:入力状態が変化した */
curtrg = (curstk ^ oldstk) & curstk; /* bit=1:今回押された */
/* 操作に応じて処理 */
if (eorstk & JOY_BTN_AB) { /* ボタン */
uchar tmp = eorstk & oldstk; /* 今回離された */
if ((curstk & JOY_BTN_AB) == JOY_BTN_AB) { /* A+B */
result = CTRL_QUIT;
} else if (tmp & JOY_BTN_A) { /* A */
result = CTRL_NEXTPAGE;
} else if (tmp & JOY_BTN_B) { /* B */
result = CTRL_BACKPAGE;
}
} else if (curtrg & JOY_STK_UP) { /* ↑ */
result = CTRL_BACKLINE;
} else if (curtrg & JOY_STK_DW) { /* ↓ */
result = CTRL_NEXTLINE;
} else if (curtrg & JOY_STK_LF) { /* ← */
result = CTRL_WIDTH_512;
} else if (curtrg & JOY_STK_RG) { /* → */
result = CTRL_WIDTH_768;
}
/* 今回のボタン状況を次回の「前状況」として保持 */
oldstk = curstk;
return result;
}
/* ユーザ操作を眺める
* 返値: 操作コード(CTRL_~)
* 注記 * 操作デバイスの受け付け優先順位は、
* キーボード→マウス→ジョイスティック
* となっている。
*/
int get_user_ctrl(void)
{
int result = CTRL_NONE;
/* キーボードを見る */
if (!chkbit(state_flag_bits, FBIT_NOCTRL_KEY)) {
result = control_by_key();
}
/* マウスを見る */
if (result == CTRL_NONE) { /* まだ有効な操作がなかったら */
if (!chkbit(state_flag_bits, FBIT_NOCTRL_MS)) {
result = control_by_mouse();
}
}
/* ジョイスティックを見る */
if (result == CTRL_NONE) { /* まだ有効な操作がなかったら */
if (!chkbit(state_flag_bits, FBIT_NOCTRL_JOY)) {
result = control_by_joystick();
}
}
return result;
}